package pw.mcdarc.mc.bython.Nms.v1_8_R3.Chat;

import net.minecraft.server.v1_8_R3.*;

/**
 * 2.0版，2004年1月
 * http://www.apache.org/licenses/
 * <p>
 * 使用、重生成及分发的术语和条件：
 * <p>
 * 1. 定义
 * <p>
 * "许可证"是指根据本文档第1到第9部分关于使用、重生成和分发的术语和条件。
 * <p>
 * "许可证颁发者"是指版权所有者或者由版权所有者批准的授权许可证的实体。
 * <p>
 * "法律实体"是指实施实体和进行控制的所有其它实体受该实体控制，或者受该实体
 * 集中控制。根据此定义，"控制"是指(i)让无论是否签订协议的上述实体，进行指导
 * 或管理的直接权利或间接权利，或者(ii)拥有百分之五十(50%)或以上已发行股票的
 * 所有者，或者(iii)上述实体的实权所有者。
 * <p>
 * "用户"(或"用户的")是指行使本许可证所授予权限的个人或法律实体。
 * <p>
 * "源程序"形式是指对包含但不限制软件源代码、文档源程序和配置文件进行修改的
 * 首选形式。
 * <p>
 * "目标"形式是指对源程序形式进行机械转换或翻译的任何形式，包括但不限于对编
 * 译的目标代码，生成的文件以及转换为其它媒体类型。
 * <p>
 * "作品"是指根据本许可证所制作的源程序形式或目标形式的著作，在著作中包含的
 * 或附加的版权通知(在下面附录中提供了一个示例)。
 * <p>
 * "衍生作品"是指基于作品(或从作品衍生而来)的源程序形式或目标形式的任何作品
 * ，以及编辑修订、注释、详细描述或其它修订等构成原创著作作品的整体。根据本
 * 许可证，衍生作品不得包括与作品及其衍生作品分离之作品，或仅与作品及其衍生
 * 作品的接口相链接(或按名称结合)之作品。
 * <p>
 * "贡献"是指任何著作作品，包括作品的原始版本和对该作品或衍生作品所做的任何
 * 修订或补充，意在提交给许可证颁发者以让版权所有者或代表版权所有者的授权个
 * 人或法律实体包含在其作品中。根据此定义，"提交"一词表示发送给许可证颁发者
 * 或其代表人，任何电子的、口头的或书面的交流信息形式，包括但不限于在由许可
 * 证颁发者或者代表其管理的电子邮件清单、源代码控制系统、以及发布跟踪系统上
 * 为讨论和提高作品的交流，但不包括由版权所有者以书面形式明显标注或指定为"非
 * 贡献"的交流活动。
 * <p>
 * "贡献者"是指许可证颁发者和代表从许可证颁发者接受之贡献的并随后包含在作品
 * 之贡献中的任何个人或法律实体。
 * <p>
 * 2. 版权许可证的授予。根据本许可证的条款，每个贡献者授予用户永久性的、全球性的
 * 、非专有性的、免费的、无版权费的、不可撤销的版权许可证以源程序形式或目标
 * 形式复制、准备衍生作品、公开显示、公开执行、授予分许可证、以及分发作品和
 * 这样的衍生作品。
 * <p>
 * 3. 专利许可证的授予。根据本许可证的条款，每个贡献者授予用户永久性的、全球性的
 * 、非专有性的、免费的、无版权费的、不可撤销的(除在本部分进行说明)专利许可
 * 证对作品进行制作、让人制作、使用、提供销售、销售、进口和其它转让，且这样
 * 的许可证仅适用于在所递交作品的贡献中因可由单一的或多个这样的贡献者授予而
 * 必须侵犯的申请专利。如果用户对任何实体针对作品或作品中所涉及贡献提出因直
 * 接性或贡献性专利侵权而提起专利法律诉讼(包括交互诉讼请求或反索赔)，那么根
 * 据本许可证，授予用户针对作品的任何专利许可证将在提起上述诉讼之日起终止。
 * <p>
 * 4. 重新分发。用户可在任何媒介中复制和分发作品或衍生作品之副本，无论是否修订，
 * 还是以源程序形式或目标形式，条件是用户需满足下列条款：
 * <p>
 * (a) 用户必须为作品或衍生作品的任何其他接收者提供本许可证的副本；并且
 * <p>
 * (b) 用户必须让任何修改过的文件附带明显的通知，声明用户已更改文件；并且
 * <p>
 * (c) 用户必须从作品的源程序形式中保留衍生作品源程序形式的用户所分发的所有版
 * 权、专利、商标和属性通知，但不包括不属于衍生作品任何部分的类似通知；
 * 并且
 * <p>
 * (d) 如果作品将"通知"文本文件包括为其分发作品的一部分，那么用户分发的任何衍
 * 生作品中须至少在下列地方之一包括，在这样的通知文件中所包含的属性通知
 * 的可读副本，但不包括那些不属于衍生作品任何部分的通知：在作为衍生作品
 * 一部分而分发的通知文本文件中；如果与衍生作品一起提供则在源程序形式或
 * 文件中；或者通常作为第三方通知出现的时候和地方，在衍生作品中产生的画
 * 面中。通知文件的内容仅供信息提供，并未对许可证进行修改。用户可在其分
 * 发的衍生作品中在作品的通知文本后或作为附录添加自己的属性通知，条件是
 * 附加的属性通知不得构成修改本许可证。
 * <p>
 * 用户可以为自身所做出的修订添加自己的版权声明并可对自身所做出修订内容或为
 * 这样的衍生作品作为整体的使用、复制或分发提供附加或不同的条款，条件是用户
 * 对作品的使用、复制和分发必须符合本许可证中声明的条款。
 * <p>
 * 5. 贡献的提交。除非用户明确声明，在作品中由用户向许可证颁发者的提交若要包含在
 * 贡献中，必须在无任何附加条款下符合本许可证的条款。尽管上面如此规定，执行
 * 许可证颁发者有关贡献的条款时，任何情况下均不得替代或修改任何单独许可证协
 * 议的条款。
 * <p>
 * 6. 商标。本许可证并未授予用户使用许可证颁发者的商号、商标、服务标记或产品名称
 * ，除非将这些名称用于合理性和惯例性描述作品起源和复制通知文件的内容时。
 * <p>
 * 7. 保证否认条款。除非因适用法律需要或书面同意，许可证颁发者以"按原样"基础提供
 * 作品(并且每个贡献者提供其贡献)，无任何明示的或暗示的保证或条件，包括但不
 * 限于关于所有权、不侵权、商品适销性、或适用性的保证或条件。用户仅对使用或
 * 重新分发作品的正确性负责，并需承担根据本许可证行使权限时的任何风险。
 * <p>
 * 8. 责任限制条款。在任何情况下并根据任何法律，无论是因侵权(包括过失)或根据合同
 * ，还是其它原因，除非根据适用法律需要(例如故意行为和重大过失行为)或经书面
 * 同意，即使贡献者事先已被告知发生损害的可能性，任何贡献者不就用户因使用本
 * 许可证或不能使用或无法使用作品(包括但不限于商誉损失、停工、计算机失效或故
 * 障，或任何商业损坏或损失)而造成的损失，包括直接的、非直接的、特殊的、意外
 * 的或间接的字符损坏而负责。
 * <p>
 * 9. 接受保证或附加责任。重新分发作品或及其衍生作品时，用户可选择提供或为符合本
 * 许可证承担之支持、担保、赔偿或其它职责义务和/或权利而收取费用。但是，在承
 * 担上述义务时，用户只可代表用户本身和用户本身责任来执行，无需代表任何其它
 * 贡献者，并且用户仅可保证、防护并保持每个贡献者不受任何因此而产生的责任或对
 * 因用户自身承担这样的保证或附加责任而对这样的贡献者所提出的索赔。
 * <p>
 * 条款结束
 * <p>
 * 附录：如何向用户作品中应用Apache许可证。
 * <p>
 * 若要向用户作品应用Apache许可证，请附加下列样本通知，将括号"[]"中的字段
 * 以用户自身的区分信息来替换(但不包括括号)。文本必须以文件格式适当的注释句
 * 法包含在其中。另外建议将文件名或类别名以及目的说明包含在相同的"打印页"上
 * 作为版权通知，以更加容易的区分出第三方档案。
 * Copyright 2016-2099 Asterisk
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
public class ChatMessageFactory {

    ChatMessage msg;
    ChatModifier modifier;

    /**
     * 构造函数
     * @param msg 消息的内容
     */
    public ChatMessageFactory(ChatMessage msg) {
        this.msg = msg;
        this.modifier = msg.getChatModifier();
    }

    /**
     * 获取ChatMessage
     * @return ChatMessage对象
     */
    public ChatMessage getMessage() {
        return this.msg;
    }

    /**
     * 添加ClickAble到Message中
     * @param action EnumClickAction枚举类型
     * @param todo 要执行的东西 比如命令啊
     */
    public void setClickable(ChatClickable.EnumClickAction action, String todo) {
        ChatClickable clickable = new ChatClickable(action, todo);
        modifier.setChatClickable(clickable);
    }

    /**
     * 添加Modifier到ChatMessage
     */
    public void setModifierToChatMessage() {
        msg.setChatModifier(modifier);
    }

    /**
     * 鼠标放到文字上事出现悬浮框
     * @param action 枚举EnumHoverAction
     * @param component ChatMessage.f()即可获得 显示在悬浮框的文字
     */
    public void setHoverable(ChatHoverable.EnumHoverAction action, IChatBaseComponent component) {
        ChatHoverable hoverable = new ChatHoverable(action, component);
    }

    /**
     * 设置文字颜色
     * @param color 枚举EnumChatFormat
     */
    public void setColor(EnumChatFormat color) {
        modifier.setColor(color);
    }

    /**
     * 获取ChatModifier
     * @return 实例
     */
    public ChatModifier getModifier() {
        return modifier;
    }

    /**
     * 设置是否为粗体
     * @param args 布尔值
     */
    public void setBold(boolean args) {
        modifier.setBold(args);
    }

    /**
     * 设置插入值
     * @param s 字符串
     */
    public void setInsertion(String s) {
        modifier.setInsertion(s);
    }

    /**
     * 设置是否斜体
     * @param bool 布尔值
     */
    public void setItalic(boolean bool) {
        modifier.setItalic(bool);
    }

    /**
     * 设置输入的字母要随机刷新= = 就是一大堆乱码
     * @param bool 布尔值
     */
    public void setRandom(boolean bool) {
        modifier.setRandom(bool);
    }

    /**
     * 设置是否有删除线
     * @param bool 布尔值
     */
    public void setStrikethrough(boolean bool) {
        modifier.setStrikethrough(bool);
    }

    /**
     * 设置下划线
     * @param bool 布尔值
     */
    public void setUnderline(boolean bool) {
        modifier.setUnderline(bool);
    }

    /**
     * 获取Clickable
     * @return ChatClickable
     */
    public ChatClickable getClickable() {
        return modifier.h();
    }

    /**
     * 获取Hoverable
     * @return ChatHoverable
     */
    public ChatHoverable getHoveralbe() {
        return modifier.i();
    }
}
